import querystring from "querystring";
import UcUtils from "../ucUtils";

/**
 * @var {string} 通信key,与uc_server中的值一致（“UCenter用户管理中心->应用管理->编辑应用”界面中的“通信密钥”字段）
 */
const UC_KEY = 'NaIeT4bd95Yer3yaX2caPfZ0H81dH2A0b3l13fXbSfo4q4xcHa29Ha72PbX6M7jb';

/**
 * uc_server发来的请求进行处理的逻辑
 * 
 * @example
 * // uc_server端的请求url形如：`/api/uc.php?code=e101J98m0h4BHkbDXE6rp4NJLW8oqxue1ZYDBsjurn%2BzKDJ%2FjAu%2FtCnIF4zvRWDXjlqGstXZsz0`。
 * // 此处需要将`code`字段的值进行解码、校验，校验通过后根据里面的`action`做响应的操作。
 * let api = new Api(code);
 * api.route()
 */
class Api
{
    /**
     * 
     * @param {string} reqCode 发来的请求的queryString的code值 
     */
    constructor(reqCode){
        this.code = reqCode
    }
    /**
     * 对请求的参数进行解码，并将请求路由到对应的操作处理逻辑中
     */
    route(){
        this.actionStr = UcUtils.getUcEncoder(UC_KEY).decode(this.code) // 将请求的参数code的值进行解码，如：6f5cpyiuk1eWzUU22v8iaPQFzoYoD7eqltUZmlYNyxv9D+ZGTb9/307FlMVNXPSr/sS/lAa+wX4
        if(this.actionStr === ''){
            throw Error('Invalid Request');
        }
        let actionParams = querystring.parse(this.actionStr) // 对形如“action=test&time=1581640700”的解码结果进行转换
        if(!Array.isArray(actionParams) || actionParams.length === 0){
            throw Error('Invalid Request');
        }
        if((new Date()).getTime()/1000 - actionParams.time > 3600){ // 有效期一个小时，注意：uc_server发来的参数time中时间戳的单位是秒
            throw Error('Authracation has expiried');
        }
        this.actionName = actionParams.action;
        if(this.actionName === 'test'){
            // todo 输出数字： 1
        }else{
            //todo 其他类型的操作暂时全部输出数字： -1
        }
    }
}